﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SyncList.Business.ValueObject;

namespace SyncList.Business.Services
{
    public class CompareService : ICompareService
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="pFirstFile"></param>
        /// <param name="pSecondFile"></param>
        public Dictionary<FileDef, int> CompareXml(FileDefCollection pFirstFile, FileDefCollection pSecondFile)
        {
            // En français pour faire plus simple ;) on va se baser sur le concept de Linux, soit un int qui contient
            // 1 : Fichier contenu dans le pFirstFile
            // 2 : Fichier contenu dans le pSecondFile
            // 3 : Fichier contenu dans les deux

            Dictionary<FileDef, int> _currentDictionary = new Dictionary<FileDef, int>();

            // 1ere passe : tous les fichiers du premier xml sont forcement dans le premier xml donc on les rajoute tous
            foreach (FileDef file in pFirstFile)
            {
                _currentDictionary.Add(file, 1);
            }

            // 2eme passe : on parcours le deuxieme fichier
            foreach (FileDef file in pSecondFile)
            {
                // dès qu'on rencontre un fichier, on incrémente de deux une fois qu'on l'a retrouvé dans la premiere liste
                if (_currentDictionary.Keys.FirstOrDefault(f => f.Hash.Equals(file.Hash)) != null)
                {
                    FileDef _foundedFileDef = _currentDictionary.Keys.First(f => f.Hash.Equals(file.Hash));
                    _currentDictionary[_foundedFileDef] += 2; 
                }
            }

            return _currentDictionary;
        }

        /// <summary>
        /// Permit to get the longer Xml File List of movies.
        /// </summary>
        /// <param name="pFirstFile"></param>
        /// <param name="pSecondFile"></param>
        /// <returns></returns>
        public Data GetLongerXml(Data pFirstFile, Data pSecondFile)
        {
            if ((pFirstFile == null) || (pSecondFile == null))
            {
                return new Data();
            }

            return pFirstFile.FileCount > pSecondFile.FileCount ? pFirstFile : pSecondFile;
        }
    }
}
